package com.lqian.method_ref;

/**
 * 方法引用：
 * 方法引用通过方法的名字来指向一个方法。
 * 方法引用可以使语言的构造更紧凑简洁，减少冗余代码。
 * 方法引用是Lambda表达式的一种简写形式。
 *  如果Lambda表达式方法体中只是调用一个特定的已经存在的方法，则可以使用方法引用。
 *  Lambda表达式可以理解为特殊的匿名内部类的一种简写方式，而方法引用可以理解为Lambda表达式的进一步简化。
 * 方法引用使用一对冒号 ::
 *
 * 1、对象::实例方法
 * 2、类::静态方法
 * 3、类::实例方法
 * 4、类::new也叫构造器引用
 */
@FunctionalInterface
public interface Supplier<T> {
    T get();

}

class Car{
    //Supplier是jdk1.8的接口，这里和lamda一起使用了
    public static Car create(final Supplier<Car> supplier){
        return supplier.get();
    }

    public static void collide(final Car car) {
        System.out.println("Collided " + car.toString());
    }

    public void follow(final Car another) {
        System.out.println("Following the " + another.toString());
    }

    public void repair() {
        System.out.println("Repaired " + this.toString());
    }
}